package com.grape.dp.template;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;


import java.util.Map;

/**
 * 描述:AbstractPayCallbackTemplate 抽象方法的模版
 * @author: myx
 * @date: 2019-07-23
 * Copyright © 2019-grape. All rights reserved.
 */
@Slf4j
public abstract class AbstractPayCallbackTemplate {


    /**
     * 定义共同行为的骨架
     *
     * @return
     */
    public String asyncCallBack() {
        // 1.验证参数和验证签名
        Map<String, String> verifySignature = verifySignature();
        // 2.日志收集 相同
        payLog(verifySignature);
        // 3. 获取验证签名状态
        String analysisCode = verifySignature.get("analysisCode");
        if (!analysisCode.equals("200")) {
            return resultFail();
        }
        // 3.更改数据库状态同时返回不同支付结果
        return asyncService(verifySignature);

    }

    /**
     * 使用多线程异步写入日志
     *
     * @param verifySignature
     */
    public void payLog(Map<String, String> verifySignature) {
        log.info("第二步骤 写入数据库....verifySignature:{}", verifySignature);
    }

    /**
     * 验证参数...
     *
     * @return
     */
    protected abstract Map<String, String> verifySignature();

    /**
     * 执行修改订单状态和返回不用的结果..
     *
     * @param verifySignature
     * @return
     */
    protected abstract String asyncService(Map<String, String> verifySignature);

    /**
     * 返回失败结果
     *
     * @return
     */
    protected abstract String resultFail();

    /**
     * 返回成功结果
     *
     * @return
     */
    protected abstract String resultSuccess();

}
